package com.itheima.reggie.controller;

import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author Mylinja 2021-12-17 星期五 16:21
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    /**
     * 注入配置文件中的路径值
     */
    @Value("${reggie.path}")
    private String basePath;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {
        //1 前端上传文件数据，此时上传过来的文件其实就是file。
        // 但是需要注意，此时的file文件是一个临时文件。现在需要把它序列化到硬盘中存储起来。否则这个方法调用完成后就被删除了
        log.info(file.toString());

        //2 获取文件名。并重新生成新的文件名
        log.info("这里应该是文件的文件名：{}", file.getOriginalFilename());
        // ----> abc.jpg
        String filename = file.getOriginalFilename();
        // ----> .jpg
        if (filename == null) {
            throw new CustomException("文件名不允许为空,请检查!");
        }
        String filePostfix = filename.substring(filename.lastIndexOf("."));
        // 使用UUID重新生成文件名，防止文件名称重复造成文件覆盖
        // ----> hajksdhaksjdh.jpg
        String newFileName = UUID.randomUUID() + filePostfix;


        //3 开始把序列化文件
        File dir = new File(basePath);
        if (!dir.exists()) {
            // 如果文件夹不存在，就创建一个文件夹
            @SuppressWarnings("unused")
            boolean mkdirs = dir.mkdirs();
        }

        try {
            //4 转存文件
            // ---> D:\ITheima\Video\JavaReggie\img\ + hajksdhaksjdh.jpg
            file.transferTo(new File(basePath + newFileName));
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("上传文件失败");
        }

        return R.success(newFileName);
    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        log.info("开始下载文件并回显。。。");
        log.info("文件名称：{}", basePath + name);
        try {
            //1 创建一个输入流，读取文件
            File file = new File((basePath + name));
            FileInputStream fis = new FileInputStream(file);

            //2 通过response响应，把输入流中的数据，响应出去
            ServletOutputStream outputStream = response.getOutputStream();
            //2.1 设置响应回去的数据格式
            response.setContentType("image/jpeg");
            //2.2 一边读一边写
            int len;
            byte[] buf = new byte[1024];
            while ((len = fis.read(buf)) != -1) {
                outputStream.write(buf, 0, len);
                outputStream.flush();
            }
            //2.3 关闭资源
            outputStream.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
